package com.aiwiown.snackmq.common.compress;

import com.aiwiown.snackmq.common.constant.MessageConstants;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 压缩器工厂，用于创建和缓存不同类型的压缩器实例。
 */
public final class CompressorFactory {

    // 使用 ConcurrentHashMap 来缓存单例的压缩器实例，确保线程安全和高性能
    private static final Map<String, Compressor> COMPRESSOR_CACHE = new ConcurrentHashMap<>();

    // 静态初始化块，预先加载 GZIP 压缩器
    static {
        COMPRESSOR_CACHE.put(MessageConstants.COMPRESSION_GZIP, new GzipCompressor());
        // 如果未来有其他压缩算法（如 SNAPPY, LZ4），在这里添加
        // COMPRESSOR_CACHE.put(MessageConstants.COMPRESSION_SNAPPY, new SnappyCompressor());
    }

    private CompressorFactory() {
        // 私有构造函数，防止实例化
    }

    /**
     * 根据算法名称获取压缩器实例。
     *
     * @param algorithm 压缩算法的名称 (例如, "GZIP")
     * @return 对应的 Compressor 实例
     * @throws IllegalArgumentException 如果找不到指定的压缩器
     */
    public static Compressor getCompressor(String algorithm) {
        if (algorithm == null || algorithm.isEmpty()) {
            throw new IllegalArgumentException("压缩算法名称不能为空。");
        }

        Compressor compressor = COMPRESSOR_CACHE.get(algorithm.toUpperCase());

        if (compressor == null) {
            throw new IllegalArgumentException("不支持的压缩算法: " + algorithm);
        }
        return compressor;
    }
}